import * as crypto from 'crypto-js';
import { v4 as uuidv4 } from 'uuid';

export class generator {
  static PasswordEncode(value: string): string {
    return crypto.MD5(value).toString();
  }

  static PrimaryKey(): string {
    return uuidv4().replace('-', '');
  }
  /**
   * 根据ID和parentId构建父子级关系树
   *
   * @param nodes 节点列表，每个节点应包含id和parentId字段
   * @param rootParentId 根节点的父ID（通常是null或0，取决于你的数据）
   * @returns 构建的树形结构数组
   */
  static buildTree(nodes: { id; parentId? }[], rootParentId?): any[] {
    // todo ts有严格的类型判断，但是key值又不允许为number类型，太恶心了,所以这里需要转换下类型
    nodes.forEach((r) => {
      r.id = String(r.id);
      r.parentId = String(r.parentId);
    });
    rootParentId = String(rootParentId);
    // 创建一个映射，用于快速查找节点
    const idNodeMap = nodes.reduce(
      (map, node) => {
        map[node.id] = { ...node, children: [] };
        return map;
      },
      {} as {
        [key: number]: { id: number; parentId?: number; children: any[] };
      },
    );

    // 初始化树的根节点列表
    const tree: any[] = [];
    // 遍历所有节点，构建树形结构
    nodes.forEach((node) => {
      const currentNode = idNodeMap[node.id];
      const parentId = node.parentId;
      // 如果是根节点或者没有指定根节点的父ID，则直接添加到树中
      if (!rootParentId || parentId == rootParentId) {
        tree.push(currentNode);
      } else {
        // 否则，查找父节点，并将当前节点添加到父节点的children列表中
        const parent = idNodeMap[parentId];
        if (parent) {
          parent.children.push(currentNode);
        }
      }
    });
    return tree;
  }

  /** 生成当前时间 **/
  static getNowString() {
    // 获取当前时间
    const currentTime = new Date();

    // 格式化时间为年-月-日 时:分:秒
    const formattedTime =
      currentTime.getFullYear() +
      '-' +
      (currentTime.getMonth() + 1) +
      '-' +
      currentTime.getDate() +
      ' ' +
      currentTime.getHours() +
      ':' +
      currentTime.getMinutes() +
      ':' +
      currentTime.getSeconds();

    return formattedTime;
  }
}
